package org.aplombh.java.awcing.basic.greedy.deriveFormulas;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import org.aplombh.java.utils.Pair;

/**
 * 农民约翰的 N 头奶牛（编号为 1..N）计划逃跑并加入马戏团，为此它们决定练习表演杂技。
 * <p>
 * 奶牛们不是非常有创意，只提出了一个杂技表演：
 * <p>
 * 叠罗汉，表演时，奶牛们站在彼此的身上，形成一个高高的垂直堆叠。
 * <p>
 * 奶牛们正在试图找到自己在这个堆叠中应该所处的位置顺序。
 * <p>
 * 这 N 头奶牛中的每一头都有着自己的重量 Wi 以及自己的强壮程度 Si。
 * <p>
 * 一头牛支撑不住的可能性取决于它头上所有牛的总重量（不包括它自己）减去它的身体强壮程度的值，现在称该数值为风险值，风险值越大，这只牛撑不住的可能性越高。
 * <p>
 * 您的任务是确定奶牛的排序，使得所有奶牛的风险值中的最大值尽可能的小。
 * <p>
 * 输入格式
 * 第一行输入整数 N，表示奶牛数量。
 * <p>
 * 接下来 N 行，每行输入两个整数，表示牛的重量和强壮程度，第 i 行表示第 i 头牛的重量 Wi 以及它的强壮程度 Si。
 * <p>
 * 输出格式
 * 输出一个整数，表示最大风险值的最小可能值。
 * <p>
 * 数据范围
 * 1≤N≤50000,
 * 1≤Wi≤10,000,
 * 1≤Si≤1,000,000,000
 * 输入样例：
 * 3
 * 10 3
 * 2 5
 * 3 3
 * 输出样例：
 * 2
 */
public class AcrobaticCows_125 {
    public static final int N = 50000;
    public static Pair[] c = new Pair[N];
    public static int n;
    public static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws IOException {
        n = Integer.parseInt(reader.readLine());
        for (int i = 0; i < n; i++) {
            String[] t = reader.readLine().split(" ");
            int w = Integer.parseInt(t[0]);
            int s = Integer.parseInt(t[1]);
            // l为w+s
            c[i] = new Pair(w + s, s);
        }

        // 还有求中位数的算法 o(n)
        Arrays.sort(c, 0, n);
        int max = -1 << 30;
        for (int i = 0, sum = 0; i < n; i++) {

            // s为当前牛的强壮程度
            int s = c[i].r;
            // w为当前牛的重量
            int w = c[i].l - s;
            // 最大风险
            max = Math.max(max, sum - s);
            // 总质量加上当前牛的指令
            sum += w;
        }
        System.out.println(max);
    }
}